#include <dlfcn.h>
#include <time.h>
#include <errno.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdint.h>
#include <string.h>
#include <strings.h>
#include <stdbool.h>
#include <pthread.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <sys/types.h>

// void detection();

int main(int argc, char const *argv[]) // ./a.out
{
    // detection();

    // 运行时，从指定的动态库中找到所需要的函数接口detection

    // 0. 从固定的配置文件中，读取要打开的动态库
    FILE *fp = fopen("配置文件.txt", "r");
    char buf[20];
    bzero(buf, 20);
    fgets(buf, 20, fp);

    strtok(buf, " \t\n"); // 去除buf中的各种空白符

    // 1. 打开指定的动态库
    void *so; // 指向任意数据类型
    if(strcmp(buf, "color") == 0)
        so = dlopen("liba.so", RTLD_LAZY);
    if(strcmp(buf, "shape") == 0)
        so = dlopen("libb.so", RTLD_LAZY);

    // 2. 找到需要的符号（函数）
    void (*detection)(void);
    detection = dlsym(so, "detection");

    // 3. 调用函数
    detection();

    // 4. 关闭动态库
    dlclose(so);

    return 0;
}
